package heyuanyuan;

public class CircularQueue {
    private int[] queue;  // 存储队列元素的数组
    private int front;    // 队头指针
    private int rear;     // 队尾指针
    private int capacity; // 队列容量（实际可用大小为capacity-1）

    // 构造函数，初始化队列
    public CircularQueue(int size) {
        this.capacity = size + 1; // 多分配一个空间用于判断满
        this.queue = new int[this.capacity];
        this.front = 0;
        this.rear = 0;
    }

    // 判断队列是否为空
    public boolean isEmpty() {
        return front == rear;
    }

    // 判断队列是否已满
    public boolean isFull() {
        return (rear + 1) % capacity == front;
    }

    // 入队操作
    public boolean enqueue(int item) {
        if (isFull()) {
            return false; // 队列已满，入队失败
        }
        queue[rear] = item;
        rear = (rear + 1) % capacity;
        return true; // 入队成功
    }

    // 出队操作
    public Integer dequeue() {
        if (isEmpty()) {
            return null; // 队列为空，返回null
        }
        int item = queue[front];
        front = (front + 1) % capacity;
        return item;
    }

    // 获取队列中元素个数
    public int size() {
        return (rear - front + capacity) % capacity;
    }

    // 打印队列内容
    public void display() {
        if (isEmpty()) {
            System.out.println("队列为空");
            return;
        }
        System.out.print("队列内容: ");
        int i = front;
        while (i != rear) {
            System.out.print(queue[i] + " ");
            i = (i + 1) % capacity;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // 1. 建立空的循环队列，有8个空间大小，依次把数据12，23，34，45，56进入队列
        CircularQueue queue = new CircularQueue(8);
        int[] firstElements = {12, 23, 34, 45, 56};
        for (int elem : firstElements) {
            queue.enqueue(elem);
        }
        System.out.println("操作1完成后:");
        queue.display();

        // 2. 把67，78，89，100依次进入队列
        int[] secondElements = {67, 78, 89, 100};
        for (int elem : secondElements) {
            if (!queue.enqueue(elem)) {
                System.out.println("警告: 队列已满，无法加入元素 " + elem);
            }
        }
        System.out.println("操作2完成后:");
        queue.display();

        // 3. 将队列中数据前4位出队，打印出来
        System.out.print("操作3出队的元素: ");
        for (int i = 0; i < 4; i++) {
            Integer item = queue.dequeue();
            if (item != null) {
                System.out.print(item + " ");
            }
        }
        System.out.println();

        // 4. 将尚未出队的数据打印出来
        System.out.println("操作4尚未出队的元素:");
        queue.display();
    }
}